/**
 * xxpay 国际化工具库
 * 支持中英文双语言切换
 * 
 * @author xxpay
 * @version 1.0
 */
(function(window) {
    'use strict';

    var I18n = {
        // 当前语言
        locale: 'zh_CN',
        
        // 消息资源
        messages: {},
        
        // 默认语言
        defaultLocale: 'zh_CN',
        
        // 支持的语言
        supportedLocales: ['zh_CN', 'en_US'],
        
        // 存储键名
        storageKey: 'xxpay_locale',

        /**
         * 初始化国际化
         * @param {string} locale 语言代码
         * @param {object} options 配置选项
         */
        init: function(locale, options) {
            options = options || {};
            
            // 设置默认语言
            if (options.defaultLocale) {
                this.defaultLocale = options.defaultLocale;
            }
            
            // 设置支持的语言
            if (options.supportedLocales) {
                this.supportedLocales = options.supportedLocales;
            }
            
            // 确定当前语言
            this.locale = locale || this.getStoredLocale() || this.getBrowserLocale() || this.defaultLocale;
            
            // 加载语言包
            this.loadMessages();
            
            // 更新页面
            this.updatePage();
            
            console.log('I18n initialized with locale:', this.locale);
        },

        /**
         * 获取国际化文本
         * @param {string} key 消息键
         * @param {object} params 参数对象
         * @returns {string} 国际化文本
         */
        t: function(key, params) {
            var message = this.messages[key] || key;
            
            // 参数替换
            if (params && typeof params === 'object') {
                for (var param in params) {
                    if (params.hasOwnProperty(param)) {
                        var regex = new RegExp('\\{' + param + '\\}', 'g');
                        message = message.replace(regex, params[param]);
                    }
                }
            }
            
            return message;
        },

        /**
         * 设置语言
         * @param {string} locale 语言代码
         * @param {boolean} reload 是否重新加载页面
         */
        setLocale: function(locale, reload) {
            if (this.supportedLocales.indexOf(locale) === -1) {
                console.warn('Unsupported locale:', locale);
                return false;
            }
            
            this.locale = locale;
            this.storeLocale(locale);
            this.loadMessages();
            
            // 通知后端切换语言
            this.notifyBackend(locale);
            
            if (reload !== false) {
                this.updatePage();
            }
            
            // 触发语言切换事件
            this.trigger('localeChanged', {
                locale: locale,
                messages: this.messages
            });
            
            return true;
        },

        /**
         * 获取当前语言
         * @returns {string} 当前语言代码
         */
        getLocale: function() {
            return this.locale;
        },

        /**
         * 判断是否为中文
         * @returns {boolean}
         */
        isChinese: function() {
            return this.locale.indexOf('zh') === 0;
        },

        /**
         * 判断是否为英文
         * @returns {boolean}
         */
        isEnglish: function() {
            return this.locale.indexOf('en') === 0;
        },

        /**
         * 加载语言包
         */
        loadMessages: function() {
            try {
                // 尝试从全局变量加载
                if (window['I18N_MESSAGES_' + this.locale.toUpperCase().replace('_', '')]) {
                    this.messages = window['I18N_MESSAGES_' + this.locale.toUpperCase().replace('_', '')];
                    return;
                }
                
                // 动态加载语言包文件
                this.loadScript('/static/i18n/' + this.locale + '.js');
            } catch (e) {
                console.error('Failed to load messages for locale:', this.locale, e);
                // 回退到默认语言
                if (this.locale !== this.defaultLocale) {
                    this.locale = this.defaultLocale;
                    this.loadMessages();
                }
            }
        },

        /**
         * 动态加载脚本
         * @param {string} src 脚本路径
         */
        loadScript: function(src) {
            var script = document.createElement('script');
            script.src = src;
            script.async = false;
            document.head.appendChild(script);
        },

        /**
         * 更新页面文本
         */
        updatePage: function() {
            var self = this;
            
            // 更新带有 data-i18n 属性的元素
            var elements = document.querySelectorAll('[data-i18n]');
            for (var i = 0; i < elements.length; i++) {
                var element = elements[i];
                var key = element.getAttribute('data-i18n');
                var params = element.getAttribute('data-i18n-params');
                
                try {
                    params = params ? JSON.parse(params) : null;
                } catch (e) {
                    params = null;
                }
                
                var text = self.t(key, params);
                
                // 根据元素类型设置文本
                if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {
                    if (element.type === 'button' || element.type === 'submit') {
                        element.value = text;
                    } else {
                        element.placeholder = text;
                    }
                } else {
                    element.textContent = text;
                }
            }
            
            // 更新页面标题
            var titleKey = document.documentElement.getAttribute('data-i18n-title');
            if (titleKey) {
                document.title = self.t(titleKey);
            }
        },

        /**
         * 获取存储的语言
         * @returns {string|null}
         */
        getStoredLocale: function() {
            try {
                return localStorage.getItem(this.storageKey) || 
                       this.getCookie(this.storageKey);
            } catch (e) {
                return null;
            }
        },

        /**
         * 存储语言偏好
         * @param {string} locale 语言代码
         */
        storeLocale: function(locale) {
            try {
                localStorage.setItem(this.storageKey, locale);
                this.setCookie(this.storageKey, locale, 365);
            } catch (e) {
                console.warn('Failed to store locale:', e);
            }
        },

        /**
         * 获取浏览器语言
         * @returns {string|null}
         */
        getBrowserLocale: function() {
            var lang = navigator.language || navigator.userLanguage;
            if (lang) {
                // 转换为标准格式
                if (lang.indexOf('zh') === 0) {
                    return 'zh_CN';
                } else if (lang.indexOf('en') === 0) {
                    return 'en_US';
                }
            }
            return null;
        },

        /**
         * 通知后端语言切换
         * @param {string} locale 语言代码
         */
        notifyBackend: function(locale) {
            // 发送AJAX请求通知后端
            var xhr = new XMLHttpRequest();
            xhr.open('POST', '/api/i18n/switch', true);
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.send('lang=' + encodeURIComponent(locale));
        },

        /**
         * 获取Cookie
         * @param {string} name Cookie名称
         * @returns {string|null}
         */
        getCookie: function(name) {
            var value = "; " + document.cookie;
            var parts = value.split("; " + name + "=");
            if (parts.length === 2) {
                return parts.pop().split(";").shift();
            }
            return null;
        },

        /**
         * 设置Cookie
         * @param {string} name Cookie名称
         * @param {string} value Cookie值
         * @param {number} days 有效天数
         */
        setCookie: function(name, value, days) {
            var expires = "";
            if (days) {
                var date = new Date();
                date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
                expires = "; expires=" + date.toUTCString();
            }
            document.cookie = name + "=" + value + expires + "; path=/";
        },

        /**
         * 事件系统
         */
        events: {},

        /**
         * 绑定事件
         * @param {string} event 事件名
         * @param {function} callback 回调函数
         */
        on: function(event, callback) {
            if (!this.events[event]) {
                this.events[event] = [];
            }
            this.events[event].push(callback);
        },

        /**
         * 触发事件
         * @param {string} event 事件名
         * @param {*} data 事件数据
         */
        trigger: function(event, data) {
            if (this.events[event]) {
                for (var i = 0; i < this.events[event].length; i++) {
                    this.events[event][i](data);
                }
            }
        }
    };

    // 导出到全局
    window.I18n = I18n;

})(window);
